相信大家對 ZK-SNARK、ZK-STARK、Recursive SNARK(遞歸SNARK)都有基礎認識了,
接下來就在介紹PLONK之前,會先深入講解ZK-SNARK。
zkSNARK 本身是一個形容詞,形容證明(proof)的性質,拆解來看的話就是:
zkSNARK 可以拆解成為:
zkSNARK 原理:
重點在於證明(proof)方式,因為證明方式是有不同種類,主要可以分為交互式證明(Interactive Proof, IP)和非交互式證明(Non Interactive Proof, NIP)。
交互式證明的例子:
驗證色盲 - 通過驗證者多次向證明者提出挑戰,以確定證明者是能分辨出紅色和綠色,只要一直成功答對,是色盲的機率就愈低。
然而大家都可以輕易觀察到交互式證明必須花大量時間和成本進行交互,次數愈多,造假率就愈低。
Fiat-Shamir Transform:
是一個工具可以把IP轉換成NIP(Non Interactive Proof)。
概念是希望把驗證者產出隨機數這個動作讓證明者去做,驗證者就只要進行一次驗證就可以,不用再向證明者發送挑戰。
隨機數:
為了使協議可進行非交互,證明者需預先使用加密雜湊函數對驗證者產生隨機性(用於隱藏挑戰)。這個會被稱為隨機預言。之後證明者可以向驗證者發送一個訊息,驗證者在收到訊息後會檢查該訊息是否正確。所以證明者需要另一個工具:Random Oracle Model來產生一個隨機數,用於產出證明。每一個傳給證明者的證明改成先傳給Random Oracle,而每次傳入的時候也包含舊的證明,即每一個證明都會有一個隨機值,而且一定得把前面的所有證明正確地計算出來才知道隨機值是什麼。在最後證明者只需要把最後的證明發送給證明者就可以。
承諾方案:
可以允許提交者提交帶有短字串的多項式,驗證者可以使用該短字串來確認所提交多項式的聲明評估。
merkle tree 是一種承諾方案,與利用一堆點形成一條線的polynomial commitment是一樣。
兩者都能做到簡潔的效果:
他們都有一個包含全部資訊的載體,而這資訊的載體能結合數個原有資訊,
merkle tree 就是個載體,tree root 就結合數個原有樹葉資訊;
polynomial commitment 也是個載體,多項式本身就結合多個點的資訊。
預處理設定的類型:
SNARK證明結構的類型:
當需要多個驗證者(例如:Zcash等區塊鏈 或Aztec等zk-Rollup)時,SNARKS就會非常有用,
因為這樣的情況之下,多個驗證節點就不必與每個證明進行多次交互, 從而減少大量時間及相關成本。
換言之,可以看到SNARK是具有很大價值,特別是在區塊鏈的應用埸景之下。
既然提到區塊鏈,那就要分享一些真實例子作說明。
Zcash就是一個應用了zk-SNARK的著名例子,Zcash 將零知識證明結合區塊鏈技術而做出一個創新的匿蹤技術,
zk-SNARK可以將匯款資料等紀錄完全隱藏,礦工可以在資料隱藏的狀態下維持帳本運作及有效地阻止雙花的情況發生,
另外,Zcash區塊鏈上有兩種不同的錢包:
當公開錢包匯款99個Zcash給公開錢包時,這項交易紀錄會跟普通的比特幣匯款一樣會被公開在Zcash的區塊鏈上,
但如果由公開錢包匯款99個Zcash給受保護錢包,在區塊鏈上會看到這公開錢包匯出99個Zcash,
不過就無法去追蹤這筆款項最終是到了哪個錢包。相反,如果一個受保護錢包匯款給一個公開錢包,
在區塊鏈上只能看到有人(不知道身份)匯款99個Zcash給這個公開地址,但無法追查匯款人是誰。
所以如果受保護錢包匯款給另一個受保護錢包時就會完全隱藏所有交易紀錄,這就是真正的匿名。
參考: